
package com.fly.uibutil;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;

/**
 * 代码注释处理：清除注释
 * 
 * @author 董华健
 */
public class ToolComment
{

    @SuppressWarnings("unused")
    private static Logger log = Logger.getLogger(ToolComment.class);

    public static String basePath = "C:\\Users\\Administrator\\Desktop\\SSHD\\";

    public static String[] dirs = {basePath + "src\\little\\ant",
            basePath + "cache\\little\\ant", basePath + "jbpm\\little\\ant",
            basePath + "struts\\little\\ant",
            basePath + "webServices\\little\\ant",
            basePath + "compass\\little\\ant",
            basePath + "quartz\\little\\ant",
            basePath + "application\\little\\ant",
            basePath + "payment\\little\\ant", basePath + "jni\\little\\ant"};

    /** 根目录 */
    // public static String rootDir = "D:\\workspace\\proj_map\\src\\com";

    public static void main(String args[]) throws FileNotFoundException,
            UnsupportedEncodingException
    {
        // deepDir(rootDir);
        for (String dir : dirs)
        {
            deepDir(dir);
        }
    }

    public static void deepDir(String rootDir) throws FileNotFoundException,
            UnsupportedEncodingException
    {
        File folder = new File(rootDir);
        if (folder.isDirectory())
        {
            String[] files = folder.list();
            for (int i = 0; i < files.length; i++)
            {
                File file = new File(folder, files[i]);
                if (file.isDirectory() && file.isHidden() == false)
                {
                    System.out.println(file.getPath());
                    deepDir(file.getPath());
                }
                else if (file.isFile() && file.getName().endsWith(".java"))
                {
                    clearComment(file.getPath());
                }
            }
        }
        else if (folder.isFile())
        {
            clearComment(folder.getPath());
        }
    }

    /**
     * @param currentDir 当前目录
     * @param currentFileName 当前文件名
     * @throws FileNotFoundException
     * @throws UnsupportedEncodingException
     */
    /**
     * @param filePathAndName
     * @throws FileNotFoundException
     * @throws UnsupportedEncodingException
     */
    @SuppressWarnings("resource")
    public static void clearComment(String filePathAndName)
            throws FileNotFoundException, UnsupportedEncodingException
    {
        StringBuilder buffer = new StringBuilder();
        String line = null; // 用来保存每行读取的内容
        InputStream is = new FileInputStream(filePathAndName);
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,
                ToolString.encoding));
        try
        {
            line = reader.readLine();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        } // 读取第一行
        while (line != null)
        { // 如果 line 为空说明读完了
            buffer.append(line); // 将读到的内容添加到 buffer 中
            buffer.append("\r\n"); // 添加换行符
            try
            {
                line = reader.readLine();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            } // 读取下一行
        }
        // 1、清除单行的注释，如： //某某，正则为 ：\/\/.*
        // 2、清除单行的注释，如：/** 某某 */，正则为：\/\*\*.*\*\/
        // 3、清除单行的注释，如：/* 某某 */，正则为：\/\*.*\*\/
        // 4、清除多行的注释，如:
        // /* 某某1
        // 某某2
        // */
        // 正则为：.*/\*(.*)\*/.*
        // 5、清除多行的注释，如：
        // /** 某某1
        // 某某2
        // */
        // 正则为：/\*\*(\s*\*\s*.*\s*?)*
        String filecontent = buffer.toString();
        buffer = null;

        Map<String, String> patterns = new HashMap<String, String>();
        patterns.put("([^:])\\/\\/.*", "$1");// 匹配在非冒号后面的注释，此时就不到再遇到http://
        patterns.put("\\s+\\/\\/.*", "");// 匹配“//”前是空白符的注释
        patterns.put("^\\/\\/.*", "");
        patterns.put("^\\/\\*\\*.*\\*\\/$", "");
        patterns.put("\\/\\*.*\\*\\/", "");
        patterns.put("/\\*(\\s*\\*\\s*.*\\s*?)*\\*\\/", "");
        // patterns.put("/\\*(\\s*\\*?\\s*.*\\s*?)*", "");
        Iterator<String> keys = patterns.keySet().iterator();
        String key = null, value = "";
        while (keys.hasNext())
        {
            // 经过多次替换
            key = keys.next();
            value = patterns.get(key);
            filecontent = replaceAll(filecontent, key, value);
        }
        System.out.println(filecontent);
        // 再输出到原文件
        try
        {
            File f = new File(filePathAndName);
            if (!f.getParentFile().exists())
            {
                f.getParentFile().mkdirs();
            }
            FileOutputStream out = new FileOutputStream(filePathAndName);
            byte[] bytes = filecontent.getBytes(ToolString.encoding);
            out.write(bytes);
            out.flush();
            out.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * @param fileContent 内容
     * @param patternString 匹配的正则表达式
     * @param replace 替换的内容
     * @return
     */
    public static String replaceAll(String fileContent, String patternString,
            String replace)
    {
        String str = "";
        Matcher m = null;
        Pattern p = null;
        try
        {
            p = Pattern.compile(patternString);
            m = p.matcher(fileContent);
            str = m.replaceAll(replace);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            m = null;
            p = null;
        }
        // 获得匹配器对象
        return str;

    }

}